package main

import (
	"encoding/json"
	"github.com/mmcdole/gofeed"
	"github.com/robfig/cron/v3"
	"github.com/spf13/viper"
	"log"
	"net/http"
	"net/url"
	"os"
	"rss/config"
	"strings"
)

func init() {
	viper.SetConfigName("config")
	viper.SetConfigType("toml")
	viper.AddConfigPath(".")
	err := viper.ReadInConfig()
	if err != nil {
		log.Fatalf("配置文件读取失败: %v", err)
	}
	err = viper.Unmarshal(&config.Conf)
	if err != nil {
		log.Fatalf("配置文件类型转换失败: %v", err)
	}
}

func main() {
	c := cron.New()
	for _, rss := range config.Conf.Rss {
		if rss.Cron != "" {
			_, err := c.AddFunc(rss.Cron, func() {
				log.Printf("检查更新'%v'情况\n", rss.Name)
				parser := gofeed.NewParser()
				if rss.Proxy != "" {
					// 解析代理 URL
					proxy, err := url.Parse(rss.Proxy)
					if err != nil {
						log.Printf("rss代理链接异常: %v", err)
					}
					// 创建 HTTP 客户端并设置代理
					httpClient := &http.Client{
						Transport: &http.Transport{
							Proxy: http.ProxyURL(proxy),
						},
					}
					parser.Client = httpClient
				}
				feed, err := parser.ParseURL(rss.Url)
				if err != nil {
					send2Gotify("rss链接解析失败!", "Url："+rss.Url+"\n错误："+err.Error(), 99, nil)
					log.Printf("rss链接解析失败: %v", err)
					return
				}
				dataList, _ := readJSONFile("log/" + rss.Name + ".json")
				analyzer := methods[rss.Func]
				newList := analyzer(feed, dataList)
				err = writeJSONFile("log/"+rss.Name+".json", newList)
				if err != nil {
					log.Fatalf("写json错误: %v", err)
				}
			})
			if err != nil {
				log.Printf("RSS任务添加失败:%v, %v\n", rss.Name, err)
				continue
			} else {
				log.Printf("RSS任务添加成功: %v\n", rss.Name)
			}
		}
	}
	c.Start()
	select {}
}

func getLastSegment(url string) string {
	// 通过 "/" 分割 URL，得到一个字符串切片
	segments := strings.Split(url, "/")
	// 获取切片的最后一个元素
	lastSegment := segments[len(segments)-1]
	return lastSegment
}

func readJSONFile(fileName string) ([]Data, error) {
	file, err := os.Open(fileName)
	if err != nil {
		if os.IsNotExist(err) {
			// 如果文件不存在，则创建一个新文件
			return []Data{}, nil // 包含默认值的切片作为默认值
		}
		return nil, err
	}
	defer func() {
		if closeErr := file.Close(); closeErr != nil {
			log.Println("无法关闭文件:", closeErr)
		}
	}()

	var data []Data
	if err := json.NewDecoder(file).Decode(&data); err != nil {
		return nil, err
	}

	return data, nil
}

func writeJSONFile(fileName string, data []Data) error {
	file, err := os.Create(fileName)
	if err != nil {
		return err
	}
	defer func() {
		if closeErr := file.Close(); closeErr != nil {
			log.Println("无法关闭文件:", closeErr)
		}
	}()

	if err := json.NewEncoder(file).Encode(data); err != nil {
		return err
	}

	return nil
}
